package com.xmy.aboutList.arraylist;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * List--ArrayList
 * 内部实现：Array
 * 特点：
 * 1）可添加重复元素
 * 2）可添加null
 * <p>
 * 主要方法：
 * 在末尾添加一个元素：boolean add(E e)
 * 在指定索引添加一个元素：boolean add(int index, E e)
 * 删除指定索引的元素：int remove(int index)
 * 删除某个元素：int remove(Object e)
 * 获取指定索引的元素：E get(int index)
 * 获取链表大小（包含元素的个数）：int size()
 * <p>
 * Note：除了使用new创建List对象外，还可以使用List.of()创建，但不支持插入null元素。
 */
public class Demo1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        list.add("apple");
        list.add(null);
        list.add("pear");

        // 使用迭代器遍历
/*        for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
            String e = iterator.next();
            System.out.println(e);
        }*/

        System.out.println("-----------------------------");

        // foreach 默认使用迭代器Iterator遍历，所以常用该方法
/*        for (String e :
                list) {
            System.out.println(e);
        }*/

        //List2Array1(list);

        //List2Array2(list);

        String[] strings = new String[]{"apple", "pear", "cherry", "watermelon"};

        Array2List2(strings);
    }

    // ==============================将List转为Array============================
    // 第一种 toArray()
    public static void List2Array1(List list) {
        Object[] objects = list.toArray();
        for (Object e :
                objects) {
            System.out.println(e);
        }
    }

    // 第二种 给toArray(T[])传入一个类型相同的Array，List内部自动把元素复制到传入的Array中
    public static void List2Array2(List list) {
        String[] s = (String[]) list.toArray(new String[list.size()]);
        for (String e :
                s) {
            System.out.println(e);
        }
    }

    // 第三种 通过List接口定义的T[] toArray(IntFunction<T[]> generator)方法：
    public static void List2Array3(List list) {
        //String[] s = list.toArray(String[]::new);
    }


    // ==============================将Array转为List============================
    //注意的是，返回的List不一定就是ArrayList或者LinkedList，因为List只是一个接口，如果我们调用List.of()，它返回的是一个只读List：
    public static void Array2List1(String[] s) {
        List<String> list = Arrays.asList(s);       // JDK版本在9以下的使用Arrays.asList()
        for (String e :
                list) {
            System.out.println(e);
        }

        //list.add("cherry");     // 不支持添加，会报错：UnsupportedOperationException
    }

    //注意的是，返回的List不一定就是ArrayList或者LinkedList，因为List只是一个接口，如果我们调用List.of()，它返回的是一个只读List：
    public static void Array2List2(String[] s) {

        List<String> list = List.of(s);        // 如果字符数组 s 存在 null 元素将产生空指针异常

        for (String e :
                list) {
            System.out.println(e);
        }
        list.add("group");      // 不支持添加，会报错：UnsupportedOperationException

    }
}
